#include <QCoreApplication>
#include "Link.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //SDK初始化
    Link::init();

    //创建视频输入模块
    LinkObject *vi=Link::create("InputVi");
    QVariantMap dataVi;
    //板卡的第一个视频输入接口，详情见文档中关于board.json的介绍
    dataVi["interface"]=Link::getConfig()["interfaceV"].toMap().firstKey();
    vi->start(dataVi);

    //创建音频输入模块
    LinkObject *ai=Link::create("InputAi");
    QVariantMap dataAi;
    //使用和视频通道对应的音频通道
    dataAi["interface"]=dataVi["interface"];
    ai->start(dataAi);

    //创建视频编码模块
    LinkObject *encV=Link::create("EncodeV");
    QVariantMap dataEncV;
    dataEncV["codec"]="h264";
    dataEncV["width"]=1920;
    dataEncV["height"]=1080;
    dataEncV["bitrate"]=4000;
    encV->start(dataEncV);

    //创建音频编码模块
    LinkObject *encA=Link::create("EncodeA");
    QVariantMap dataEncA;
    dataEncA["codec"]="aac";
    dataEncA["samplerate"]=48000;
    dataEncA["bitrate"]=128;
    encA->start(dataEncA);

    //创建封装模块(rtmp)
    LinkObject *rtmp=Link::create("Mux");
    QVariantMap dataRtmp;
    //推流到本地nginx-rtmp服务
    dataRtmp["path"]="rtmp://127.0.0.1/live/test";
    rtmp->start(dataRtmp);

    //连接音频数据流(音频采集->音频编码->封装推流)
    ai->linkA(encA)->linkA(rtmp);
    //连接视频数据流(视频采集->视频编码->封装推流)
    vi->linkV(encV)->linkV(rtmp);

    //创建本地rtsp服务
    LinkObject *rtspServer=Link::create("Rtsp");
    rtspServer->start();

    //创建封装模块(rtsp)
    LinkObject *rtsp=Link::create("Mux");
    QVariantMap dataRtsp;
    //本地数据的一个内存传输协议(mem://)
    dataRtsp["path"]="mem://test";
    dataRtsp["format"]="rtsp";
    rtsp->start(dataRtsp);

    //前面已经完成了采集到编码的连接，这里只需要连接后续的数据流
    //这里rtsp与rtmp的连接方式不同
    //rtmp、srt、hls以及文件录制这一类的封装是将数据发送到程序外部，所以在Mux模块填写正确的path就完成了
    //rtsp、udp、webrtc等协议，由于需要将数据继续传递给进程内相应的服务模块，所以还需要执行一步"mux"到"server"的连接。
    encA->linkA(rtsp)->linkA(rtspServer);
    encV->linkV(rtsp)->linkV(rtspServer);

    return a.exec();
}

